/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pessoas.presenter;

import pessoas.ordenacao.ComparadorDeTelefonePessoa;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.TreeSet;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;
import javax.swing.table.DefaultTableModel;
import pessoas.model.Pessoa;
import pessoas.collection.Pessoas;
import pessoas.interfaces.IConfiguraViewInclusao;
import pessoas.interfaces.IObservador;
import pessoas.ordenacao.ComparadorDeTelefoneDesc;
import pessoas.ordenacao.ComparadorNomeCres;
import pessoas.ordenacao.ComparadorNomeDecres;
import pessoas.view.InclusaoPessoaView;
import pessoas.view.ManterPessoaView;

/**
 *
 * @author clayton
 */
public final class ManterPessoaPresenter implements IObservador {

    private DefaultTableModel tm;
    private Pessoas pessoas;
    private ManterPessoaView view;
    private IConfiguraViewInclusao configInclusao;
    private File arquivo;
    private TreeSet<Pessoa> busca = null;

    public ManterPessoaPresenter() {
        view = new ManterPessoaView();
// ------------------> Parte de codigo que deixa uma tabela não editavel
        tm = new DefaultTableModel( new Object[] {"Nome","Telefone"},0){
            boolean[] canEdit = new boolean[]{
                false,false
            };
            @Override
            public boolean isCellEditable(int rowIndex, int columnIndex){
                return canEdit[columnIndex];
            }
        };
        try {
            pessoas = Pessoas.getInstancia();
            pessoas.carregaPessoas();
            carregaPessoas(pessoas.getTreeSet());
            pessoas.add(this);
        } catch (FileNotFoundException ex) {
            arquivo = new File("src/pessoas/data/pessoas.txt");

            try {
                FileWriter w = new FileWriter(arquivo, true);
            } catch (IOException ex1) {
                JOptionPane.showMessageDialog(view, "Não foi possível criar o arquivo pessoa.txt");
            }
            JOptionPane.showMessageDialog(view, "Não há contatos cadastrados ou Não foi possível carrega-los");
        }

        view.getCbOrdenarTelefone().addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                ordenaCrescenteTelefone();
            }
        });

        view.getOrdenaTelefoneDecrescente().addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent ae) {
                ordenaDecrescenteTelefone();
            }
        });

        view.getOrdenarNomeCrescente().addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent ae) {
                ordenaCrescenteNome();
            }
        });

        view.getOrdenaNomeDecrescente().addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent ae) {
                ordenaDecrescenteNome();
            }
        });

        view.getBtnFechar().addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                fechar();
            }
        });

        view.getBtnBuscarPessoa().addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent ae) {
                try {
                    buscarPessoa();
                } catch (FileNotFoundException ex) {
                    JOptionPane.showMessageDialog(null, "Ocorreu um erro ao buscar");
                }
            }
        });

        view.getBtnEditarPessoa().addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent ae) {
                try {
                    editarPessoa();
                } catch (FileNotFoundException ex) {
                    JOptionPane.showMessageDialog(null, "Ocorreu um erro. Concacte seu administrador");
                }

            }
        });

        view.getBtnNovoCadastro().addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent ae) {
                try {
                    novoCadastro();
                } catch (FileNotFoundException ex) {
                    Logger.getLogger(ManterPessoaPresenter.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        });

        view.getBtnVisualizarCadastro().addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent ae) {
                visualizarCadastro();
            }
        });

        view.getBtnExcluir().addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent ae) {
                try {
                    excluirPessoa();
                } catch (IOException ex) {
                    JOptionPane.showMessageDialog(null, "Ocorreu um erro. Concacte seu administrador");
                }
            }
        });
        view.setLocationRelativeTo(view);
        view.setVisible(true);

        view.getJtPessoas().setModel(tm);

    }

    private void fechar() {
        view.dispose();
    }

    public void carregaPessoas(Collection<Pessoa> c) {
        tm.setNumRows(0);
        Iterator<Pessoa> it = c.iterator();
        while (it.hasNext()) {
            Pessoa p = it.next();
            String pessoa = p.toString();
            String linha[] = pessoa.split(",");
            tm.addRow(new Object[]{linha[0], linha[1]});
        }
    }

    private void ordenaCrescenteNome() {
        if (view.getOrdenarNomeCrescente().isSelected()) {
            view.getOrdenaTelefoneDecrescente().setSelected(false);
            view.getOrdenaNomeDecrescente().setSelected(false);
            view.getCbOrdenarTelefone().setSelected(false);
            ArrayList<Pessoa> lista = new ArrayList<Pessoa>(pessoas.getTreeSet());
            Collections.sort(lista, new ComparadorNomeCres());
            carregaPessoas(lista);
        } else {
            carregaPessoas(pessoas.getTreeSet());
        }
    }

    private void ordenaCrescenteTelefone() {
        if (view.getCbOrdenarTelefone().isSelected()) {
            view.getOrdenaTelefoneDecrescente().setSelected(false);
            view.getOrdenaNomeDecrescente().setSelected(false);
            view.getOrdenarNomeCrescente().setSelected(false);
            ArrayList<Pessoa> lista = new ArrayList<Pessoa>(pessoas.getTreeSet());
            Collections.sort(lista, new ComparadorDeTelefonePessoa());
            carregaPessoas(lista);
        } else {
            carregaPessoas(pessoas.getTreeSet());
        }
    }

    private void ordenaDecrescenteNome() {
        if (view.getOrdenaNomeDecrescente().isSelected()) {
            view.getOrdenaTelefoneDecrescente().setSelected(false);
            view.getOrdenarNomeCrescente().setSelected(false);
            view.getCbOrdenarTelefone().setSelected(false);
            ArrayList<Pessoa> lista = new ArrayList<Pessoa>(pessoas.getTreeSet());
            Collections.sort(lista, new ComparadorNomeDecres());
            carregaPessoas(lista);
        } else {
            carregaPessoas(pessoas.getTreeSet());
        }
    }

    private void ordenaDecrescenteTelefone() {
        if (view.getOrdenaTelefoneDecrescente().isSelected()) {
            view.getCbOrdenarTelefone().setSelected(false);
            view.getOrdenaNomeDecrescente().setSelected(false);
            view.getOrdenarNomeCrescente().setSelected(false);
            ArrayList<Pessoa> lista = new ArrayList<Pessoa>(pessoas.getTreeSet());
            Collections.sort(lista, new ComparadorDeTelefoneDesc());
            carregaPessoas(lista);
        } else {
            carregaPessoas(pessoas.getTreeSet());
        }
    }

    private void buscarPessoa() throws FileNotFoundException {

        String tipo = view.getComboxTipoBusca().getSelectedItem().toString();
        String busca = view.getTxtElementoBusca().getText();
        if (busca.isEmpty()) {
            JOptionPane.showMessageDialog(view, "preencha o campo de busca");
        } else {
            carregaPessoas(Pessoas.getInstancia().buscaPessoa(busca, tipo));
        }
    }

    private void editarPessoa() throws FileNotFoundException {
        int WITH = 0;
        if (view.getJtPessoas().getSelectedRow() < 0) {
            JOptionPane.showMessageDialog(view, "selecione uma linha que deseja editar");
        } else {
            String tel = view.getJtPessoas().getValueAt(view.getJtPessoas().getSelectedRow(), 1).toString();
            String nome = view.getJtPessoas().getValueAt(view.getJtPessoas().getSelectedRow(), 0).toString();
            Pessoa p = new Pessoa(nome, tel);

            new EditarPessoaPresenter(new InclusaoPessoaView(), p);

        }

    }

    private void novoCadastro() throws FileNotFoundException {
        new InclusaoPessoaPresenter(new InclusaoPessoaView());

    }

    private void visualizarCadastro() {
        int WITH = 0;
        if (view.getJtPessoas().getSelectedRow() < 0) {
            JOptionPane.showMessageDialog(view, "selecione uma linha para Visualizar");
        } else {
            String tel = view.getJtPessoas().getValueAt(view.getJtPessoas().getSelectedRow(), 1).toString();
            String nome = view.getJtPessoas().getValueAt(view.getJtPessoas().getSelectedRow(), 0).toString();
            Pessoa p = new Pessoa(nome, tel);
            new VisualizarPessoaPresenter(new InclusaoPessoaView(), p);
        }

    }

    private void excluirPessoa() throws FileNotFoundException, IOException {

        if (view.getJtPessoas().getSelectedRow() < 0) {
            JOptionPane.showMessageDialog(view, "selecione uma linha para excluir");
        } else {
            String telefone = view.getJtPessoas().getValueAt(view.getJtPessoas().getSelectedRow(), 1).toString();
            String nomePessoa = view.getJtPessoas().getValueAt(view.getJtPessoas().getSelectedRow(), 0).toString();
            if (JOptionPane.showConfirmDialog(view, "Tem certeza que realmente deseja excluir o cadastro\n "
                    + "Nome: " + nomePessoa + "\n" + "Telefone: " + telefone, "Excluir Pessoa", 0, 1) == 0) {
                Pessoas.getInstancia().excluirPessoa(telefone);
                JOptionPane.showMessageDialog(null, "Contato Excluido com sucesso!!");
                pessoas.notificar();

            }
        }
    }

    @Override
    public void atualizar() {
        try {
            carregaPessoas(Pessoas.getInstancia().getTreeSet());
        } catch (FileNotFoundException ex) {
            JOptionPane.showMessageDialog(view, "Ocorreu um erro ao caregar os contatos. Concate seu administrador");
        }
    }
}
